IPC机制: 进程之间的通信,指两个进程之间进行数据交换
队列的实现: 管道 + 锁
在队列中数据是安全的,因为队列中有锁的机制,保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行修改
进程之间通信,可以使用 multiprocessing 中的 Queue模块
队列有两种创建方式 第一种不传参数 这个队列就没有长度限制 ;传参数,创建一个有最大长度限制的队列
如果要实现进程之间的通信,就使用队列来实现就可以了,不要使用 Pipe管道 或者 Manager 来实现,因为数据不安全虽然可以加锁来实现数据安全,但是队列已经自带锁的机制了
队列的3个方法:
.put() -> 添加值到队列
.get() -> 获取队列中的值
.qsize() -> 获取队列的长度,是不准确的,因为在获取的过程中有可能进程就会往队列里中添加值
from multiprocessing import Queue
q = Queue()
q.put(1)
q.put(2)
print(q.get()) # 1
print(q.get()) # 2
print(q.get()) # 此时全部值已经被获取完了,如果再进行获取就会形成 阻塞 等待队列进入第3个值
from multiprocessing import Queue
q = Queue(3) # 设置一个长度为3的队列
q.put(1)
q.put(2)
q.put(3)
# print(q.get()) # 取第一个队列中的第一个值,让第4个值添加到队列中
q.put(4) # 此时队列中的位置已经满了,如果再往队列里添加值就会形成 阻塞,只有第一个值被取了,这个值才能添加进入
1. 子进程与主进程之间的通讯
from multiprocessing import Process
from multiprocessing import Queue
def q_put(q):
q.put('hello') # 将值添加到队列中
if __name__ == '__main__':
q = Queue()
p1 = Process(target=q_put, args=(q,))
p1.start()
print(q.get()) # 通过队列获取到子进程的值
2. 子进程与子进程之间的通讯
from multiprocessing import Process
from multiprocessing import Queue
def q_put(q):
q.put('hello') # 将值添加到队列中
def q_get(q):
print(q.get()) # 通过队列获取到其他子进程的值
if __name__ == '__main__':
q = Queue()
p1 = Process(target=q_put, args=(q,))
p1.start()
p2 = Process(target=q_get, args=(q,))
p2.start()